Make combobox menu popdown keybindable (#433593)
authorCarlos Garnacho <carlos@imendio.com>
Fri, 18 May 2007 11:33:13 +0000 (11:33 +0000)
committerCarlos Garnacho <carlosg@src.gnome.org>
Fri, 18 May 2007 11:33:13 +0000 (11:33 +0000)
2007-05-18  Carlos Garnacho  <carlos@imendio.com>

        Make combobox menu popdown keybindable (#433593)

        * gtk/gtkcombobox.c (gtk_combo_box_class_init): Add "popdown" binding
        signal and keybindings.
        (gtk_combo_box_real_popdown): Added, "popdown" keybinding signal
        handler.
        (gtk_combo_box_menu_key_press):
        (gtk_combo_box_list_key_press): forward the event to the combobox if
        it wasn't handled by the menu.

svn path=/trunk/; revision=17861

ChangeLog
gtk/gtkcombobox.c

index 46ae683af033f0fea03e1d32f1c53e335c03f6bd..2322bde022f6486ae91813899f375eca40e56ab8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2007-05-18  Carlos Garnacho  <carlos@imendio.com>
+
+       Make combobox menu popdown keybindable (#433593)
+
+       * gtk/gtkcombobox.c (gtk_combo_box_class_init): Add "popdown" binding
+       signal and keybindings.
+       (gtk_combo_box_real_popdown): Added, "popdown" keybinding signal
+       handler.
+       (gtk_combo_box_menu_key_press):
+       (gtk_combo_box_list_key_press): forward the event to the combobox if
+       it wasn't handled by the menu.
+
 2007-05-18  Carlos Garnacho  <carlos@imendio.com>
 
        * gtk/gtknotebook.c (gtk_notebook_init) (gtk_notebook_drag_motion)
index afdc67876fd7301fbaa30232b40c54b42e4b0ca9..93e6b924cfb7ea617d4d457ad23322eb1494fc57 100644 (file)
@@ -39,6 +39,7 @@
 #include "gtkvseparator.h"
 #include "gtkwindow.h"
 #include "gtkprivate.h"
+#include "gtkmarshal.h"
 
 #include <gdk/gdkkeysyms.h>
 
@@ -189,6 +190,7 @@ enum {
   CHANGED,
   MOVE_ACTIVE,
   POPUP,
+  POPDOWN,
   LAST_SIGNAL
 };
 
@@ -295,6 +297,7 @@ static gchar *  gtk_combo_box_real_get_active_text (GtkComboBox      *combo_box)
 static void     gtk_combo_box_real_move_active     (GtkComboBox      *combo_box,
                                                     GtkScrollType     scroll);
 static void     gtk_combo_box_real_popup           (GtkComboBox      *combo_box);
+static gboolean gtk_combo_box_real_popdown         (GtkComboBox      *combo_box);
 
 /* listening to the model */
 static void     gtk_combo_box_model_row_inserted   (GtkTreeModel     *model,
@@ -530,11 +533,29 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
                              g_cclosure_marshal_VOID__VOID,
                              G_TYPE_NONE, 0);
 
+  combo_box_signals[POPDOWN] =
+    _gtk_binding_signal_new (I_("popdown"),
+                             G_OBJECT_CLASS_TYPE (klass),
+                             G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                             G_CALLBACK (gtk_combo_box_real_popdown),
+                             NULL, NULL,
+                             gtk_marshal_BOOLEAN__VOID,
+                             G_TYPE_BOOLEAN, 0);
+
   /* key bindings */
   binding_set = gtk_binding_set_by_class (widget_class);
 
   gtk_binding_entry_add_signal (binding_set, GDK_Down, GDK_MOD1_MASK,
                                "popup", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Down, GDK_MOD1_MASK,
+                               "popup", 0);
+
+  gtk_binding_entry_add_signal (binding_set, GDK_Up, GDK_MOD1_MASK,
+                               "popdown", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Up, GDK_MOD1_MASK,
+                               "popdown", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
+                               "popdown", 0);
 
   gtk_binding_entry_add_signal (binding_set, GDK_Up, 0,
                                "move-active", 1,
@@ -752,7 +773,7 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
                                                          P_("Whether the combo's dropdown is shown"),
                                                          FALSE,
                                                          GTK_PARAM_READABLE));
-  
+
   gtk_widget_class_install_style_property (widget_class,
                                            g_param_spec_boolean ("appears-as-list",
                                                                  P_("Appears as list"),
@@ -1852,6 +1873,18 @@ gtk_combo_box_real_popup (GtkComboBox *combo_box)
   gtk_grab_add (combo_box->priv->popup_window);
 }
 
+static gboolean
+gtk_combo_box_real_popdown (GtkComboBox *combo_box)
+{
+  if (combo_box->priv->popup_shown)
+    {
+      gtk_combo_box_popdown (combo_box);
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
 /**
  * gtk_combo_box_popdown:
  * @combo_box: a #GtkComboBox
@@ -3752,17 +3785,16 @@ gtk_combo_box_menu_key_press (GtkWidget   *widget,
                              gpointer     data)
 {
   GtkComboBox *combo_box = GTK_COMBO_BOX (data);
-  guint state = event->state & gtk_accelerator_get_default_mod_mask ();
 
-  if ((event->keyval == GDK_Up || event->keyval == GDK_KP_Up) && 
-      state == GDK_MOD1_MASK)
+  if (!gtk_bindings_activate_event (GTK_OBJECT (widget), event))
     {
-      gtk_combo_box_popdown (combo_box);
-
-      return TRUE;
+      /* The menu hasn't managed the
+       * event, forward it to the combobox
+       */
+      gtk_bindings_activate_event (GTK_OBJECT (combo_box), event);
     }
-  
-  return FALSE;
+
+  return TRUE;
 }
 
 static gboolean
@@ -3772,21 +3804,7 @@ gtk_combo_box_list_key_press (GtkWidget   *widget,
 {
   GtkComboBox *combo_box = GTK_COMBO_BOX (data);
   GtkTreeIter iter;
-  guint state = event->state & gtk_accelerator_get_default_mod_mask ();
 
-  if (event->keyval == GDK_Escape ||
-      ((event->keyval == GDK_Up || event->keyval == GDK_KP_Up) && 
-       state == GDK_MOD1_MASK))
-    {
-      gtk_combo_box_popdown (combo_box);
-      
-      /* reset active item -- this is incredibly lame and ugly */
-      if (gtk_combo_box_get_active_iter (combo_box, &iter))
-       gtk_combo_box_set_active_iter (combo_box, &iter);
-      
-      return TRUE;
-    }
-    
   if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter ||
       event->keyval == GDK_space || event->keyval == GDK_KP_Space) 
   {
@@ -3807,7 +3825,15 @@ gtk_combo_box_list_key_press (GtkWidget   *widget,
     return TRUE;
   }
 
-  return FALSE;
+  if (!gtk_bindings_activate_event (GTK_OBJECT (widget), event))
+    {
+      /* The list hasn't managed the
+       * event, forward it to the combobox
+       */
+      gtk_bindings_activate_event (GTK_OBJECT (combo_box), event);
+    }
+
+  return TRUE;
 }
 
 static void